#include<stdio.h>
/*lnitlist(L);//建立空顺序表
listlengh(L);//计算元素个数
getdata(L,i);//查第i个元素的值
lnslist(L,i,e);//第i个位置前插入元素e，L长度加1
dellist(L,i,e);//删除第i个元素，e返回值，L长度减1
locate(L,e);//查e的值，返回e的地址，不存在则返回NULL
destroylist(L);//销毁线性表
clearlist(L);//清空线性表
emptylist(L);//判断是否为空
*/

#define maxsize 100
#define ok 0
#define error -1
typedef struct node {
	int elem[maxsize];
	int last;
}seqlist;

void lnitlist(seqlist *L) {
	L->last = -1;//初始化长度为0，结构体指针
}
int creatlist(seqlist* L, int ary[], int n) {
	if (n > maxsize)
	{
		printf("空间不够");
			return error;
	}for (int i = 0; i < n; i++) {
		L->elem[i] = ary[i];
	}
	L->last = n-1;
	return ok;
}//建立长度为n的顺序表，将数组中元素放在顺序表中
void printlist(seqlist* L) {
	for (int i = 0; i <= L->last; i++) {
		printf("%d\n", L->elem[i]);
	}puts("");
}
int locate(seqlist *L,int e) {
	int i = 0;
	while ((i <= L->last) && (L->elem[i] != e)) {
		i++;
	}if (i <= L->last) {
		return i+1;
	}
	else { return error; }
}//按值查找返回序号
int getdata(seqlist *L, int i) {
	while ((i < 1) || (i > L->last+1)) {
		printf("查找位置不合法");
		return error;
	}
	/*if (L->elem[i] != NULL) {
		return L->elem[i];
	}*/
	return L->elem[i-1];
	//else return error;
}//按序号查找返回值
int lnslist(seqlist *L, int i, int e) {
	while (i<1 || (i>L->last+1)) {
		printf("插入位置不合法");
		return error;
	}
	if (L->last+2 > maxsize) {
		printf("表已经满了");
		return error;
	}
	for (int k = L->last; k >= i - 2; k--) {
		L->elem[k + 1] = L->elem[k];
	}
		L->elem[i-1] = e;
		L->last ++;
		return ok;
}//z第i个位置之前插入 
int dellist(seqlist *L, int i,int *e) {
	while (i<1 || (i>L->last+1)) //i>L.last+1 ?
	{printf("删除位置不合法");
	return 0;
	}if (L->last == -1) {
		printf("空表");
		return error;
	}
	*e = L->elem[i - 1];//存放
	for (int k = i; k <= L->last; k++) {
		L->elem[k-1] = L->elem[k];
	}
	L->last--;
	return ok;
}//删除第i个元素
int listlengh(seqlist *L) {
	return L->last+1;
}//计算表长
void mergelist(seqlist* Lc, seqlist* La, seqlist* Lb) {
	int i=0, j=0, k=0;
	while (i <= La->last && j <=Lb->last) {
		if (La->elem[i] >= Lb->elem[j]) {
			Lc->elem[k] = Lb->elem[j];
			j++, k++;
		}
		else {
			Lc->elem[k] = La->elem[i];
			i++, k++;
		}
		if (i <= La->last) {
			Lc->elem[k] = La->elem[i];
			i++;
		}
		else {
			Lc->elem[k] = Lb->elem[j];
			j++;
		}
		Lc->last = La->last + Lb->last;//+1?
	}
}//合并线性表
int emply(seqlist* L) {
	if (L->last == -1) {
		printf("线性表为空");
		return error;
	}
	else return 0;	
}
int main() {
	int arr[] = { 1,2,3,4,1,2,3,4,1 };
	seqlist L;
	creatlist(&L, arr, 9);
	printf("当前顺序表数据为：\n");
	printlist(&L);
}
